package com.guaoran.other.observer.core;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 事件的注册和监听
 */
public class EventListener {
    //Map相当于是一个注册器
    protected Map<Enum,Event> events = new HashMap<Enum,Event>();
    /**
     * 注册事件
     * @param eventType
     * @param target
     * @param callback
     */
    public void addListener(Enum eventType,Object target,Method callback){
        //最后会用反射调用这个方法
        events.put(eventType,new Event(target,callback));
    }

    /**
     * 有事件的时候进行触发器的调用
     * @param e
     */
    private void trigger(Event e){
        e.setSource(this);
        e.setTime(System.currentTimeMillis());
        try {
            //通过反射去调用方法
            e.getCallback().invoke(e.getTarget(),e);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }


    protected void trigger(Enum call){
        if(!this.events.containsKey(call)){ return ;}
        //从注册事件器里获得某个类型的事件，对应着事件的通知对象以及方法
        trigger(this.events.get(call).setTrigger(call.toString()));
    }


}
